﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SistemaLib.Entidades;
using SistemaLib.Persistencia;
using System.Data;
using SistemaLib.sipe.util;

namespace SistemaLib.Gestores
{
    public static class GestorRecursoCalendario
    {
        internal static void Eliminar(int idCalendario)
        {
            DbRecursoCalendario db = new DbRecursoCalendario();
            db.Eliminar(idCalendario);
        }

        internal static void Guardar(RecursoCalendario cal)
        {
            DbRecursoCalendario db = new DbRecursoCalendario();
            db.Guardar(cal);
        }

        public static RecursoCalendario CargarRecursoCalendarioPorId(int idTas)
        {
            DbRecursoCalendario db = new DbRecursoCalendario();
            return db.CargarRecursoCalendarioPorId(idTas);
        }

        public static RecursoCalendario CargarCalendarioRecurso(int idRH, DateTime fecha)
        {
            DbRecursoCalendario db = new DbRecursoCalendario();
            RecursoCalendario cal = db.CargarCalendarioRecurso(idRH, fecha);
            
            if (cal.Id == 0)    //Si no existia calendario generado para esa fecha se genera automaticamente.
            {
                Recurso rec = GestorRecursos.CargarRecursoPorId(idRH);
                cal.HorasLibres = rec.Horas;
                cal.Fecha = fecha;
                cal.IdRH = idRH;
                GestorRecursoCalendario.Guardar(cal);
            }

            return cal;
        }

        public static bool RecursoDisponible(TareaAsignacion tas)
        {
            RecursoCalendario cal = CargarCalendarioRecurso(tas.IdRH, Fechas.ProximoDiaHabil(tas.Fecha)); //Calendario del dia en que comienza la tarea
                        
            if (cal.HorasLibres > 0)       //Tiene horas Libres el recurso para esa fecha?                   
            {
                if (cal.HorasLibres >= tas.Horas)       //Le alcanzan para completar la tarea?
                    return true;
                else                                        //Si no le alcanzan verifico si tiene disponibilidad los proximos dias,
                {                                           //para completar las horas que le restarian.
                    decimal horasTarea = tas.Horas;
                    RecursoCalendario nextCal = CargarCalendarioRecurso(cal.IdRH, cal.Fecha);

                    while (horasTarea > nextCal.HorasLibres)
                    {
                        horasTarea = horasTarea - cal.HorasLibres;
                        if (horasTarea <= 0)
                            return true;

                        nextCal = CargarCalendarioRecurso(nextCal.IdRH, Fechas.ProximoDiaHabil(nextCal.Fecha.AddDays(1)));
                        if (nextCal.HorasLibres <= 0)
                            return false;
                    }
                    return true;
                }                    
            }
            return false;
        }

       
        public static void ActualizarCalendarioRecurso(TareaAsignacion tas) 
        {
            RecursoCalendario cal = CargarCalendarioRecurso(tas.IdRH, Fechas.ProximoDiaHabil(tas.Fecha));

            if (cal.HorasLibres >= tas.Horas) //Le entra completa en un solo dia
            {
                cal.HorasLibres = cal.HorasLibres - tas.Horas; //Le actualiza las horas libres restantes.
                GestorRecursoCalendario.Guardar(cal);
            }
            else
            {
                decimal horasRestantes = tas.Horas - cal.HorasLibres;                
                cal.HorasLibres = 0;                                
                GestorRecursoCalendario.Guardar(cal);

                RecursoCalendario nextCal = CargarCalendarioRecurso(cal.IdRH, Fechas.ProximoDiaHabil(cal.Fecha.AddDays(1)));

                while(horasRestantes > 0)
                {
                    if (nextCal.HorasLibres < horasRestantes)
                    {
                        horasRestantes = horasRestantes - nextCal.HorasLibres;
                        nextCal.HorasLibres = 0;
                    }
                    else
                    {
                        nextCal.HorasLibres = nextCal.HorasLibres - horasRestantes;
                        horasRestantes = 0;
                    }
                    
                    GestorRecursoCalendario.Guardar(nextCal);

                    nextCal = CargarCalendarioRecurso(nextCal.IdRH, Fechas.ProximoDiaHabil(nextCal.Fecha.AddDays(1)));
                }
                
                GestorRecursoCalendario.Guardar(nextCal);
            }
        }

    }
}
